package com.coursehub.progress.service;

import com.coursehub.progress.dto.ChapterProgressUpdateDto;
import com.coursehub.progress.dto.MaterialProgressUpdateDto;
import com.coursehub.progress.dto.ProgressResponseDto;
import com.coursehub.progress.entity.StudentChapter;
import com.coursehub.progress.entity.StudentMaterial;

import java.util.List;
import java.util.Map;

/**
 * 学习进度服务接口
 */
public interface ProgressService {
    
    /**
     * 更新章节学习进度
     */
    StudentChapter updateChapterProgress(ChapterProgressUpdateDto dto);
    
    /**
     * 更新资料学习进度
     */
    StudentMaterial updateMaterialProgress(MaterialProgressUpdateDto dto);
    
    /**
     * 获取用户在指定课程的章节学习进度
     */
    List<StudentChapter> getUserChapterProgress(String userId, String courseId);
    
    /**
     * 获取用户在指定课程的资料学习进度
     */
    List<StudentMaterial> getUserMaterialProgress(String userId, String courseId);
    
    /**
     * 获取用户在指定课程的整体学习进度
     */
    ProgressResponseDto getUserOverallProgress(String userId, String courseId);
    
    /**
     * 获取课程的整体学习进度百分比
     */
    Integer getCourseProgress(String userId, String courseId);
    
    /**
     * 获取章节的学习进度百分比
     */
    Integer getChapterProgress(String userId, String chapterId);
    
    /**
     * 获取资料的学习进度（0或100）
     */
    Integer getMaterialProgress(String userId, String materialId);
    
    /**
     * 批量获取用户的章节学习进度
     */
    Map<String, Integer> getBatchChapterProgress(String userId, List<String> chapterIds);
    
    /**
     * 批量获取用户的资料学习进度
     */
    Map<String, Boolean> getBatchMaterialProgress(String userId, List<String> materialIds);
    
    /**
     * 获取班级的课程完成率统计
     */
    Integer getClassCompletionRate(String classId);
    
    /**
     * 获取练习的完成率统计
     */
    Integer getExerciseCompletionRate(String exerciseId);
    
    /**
     * 验证用户是否存在
     */
    boolean validateUser(String userId);
    
    /**
     * 验证课程是否存在
     */
    boolean validateCourse(String courseId);
    
    /**
     * 验证章节是否存在
     */
    boolean validateChapter(String chapterId);
    
    /**
     * 验证资料是否存在
     */
    boolean validateMaterial(String materialId);
    
    /**
     * 验证班级是否存在
     */
    boolean validateClass(String classId);
    
    /**
     * 验证练习是否存在
     */
    boolean validateExercise(String exerciseId);
    
    // ====================== 资料学习状态管理方法（兼容单体系统） ======================
    
    /**
     * 获取学生在指定章节中已完成的资料
     */
    List<Map<String, Object>> getCompletedMaterialsByStudentAndChapter(String userId, String chapterId);
    
    /**
     * 更新学生资料学习状态
     */
    void updateStudentMaterialStatus(String userId, String materialId, boolean isFinished);
    
    /**
     * 获取学生资料学习状态
     */
    boolean getStudentMaterialStatus(String userId, String materialId);
    
    /**
     * 获取学生已完成的章节ID列表
     */
    List<String> getCompletedChapterIds(String userId, String courseId);
    
    /**
     * 获取学生已完成的资料ID列表
     */
    List<String> getCompletedMaterialIds(String userId, String courseId);
    
    /**
     * 标记章节为完成状态
     */
    void markChapterAsComplete(String userId, String chapterId);
    
    /**
     * 标记资料为已完成
     */
    void markMaterialAsComplete(String userId, String materialId);
    
    // ==================== 练习完成状态管理 ====================
    
    /**
     * 获取用户已完成的练习列表
     */
    List<String> getCompletedExerciseIds(String userId);
    
    /**
     * 获取用户未完成的练习列表
     */
    List<String> getUnfinishedExerciseIds(String userId);
    
    /**
     * 根据课程ID获取用户已完成的练习
     */
    List<String> getCompletedExerciseIdsByCourse(String userId, String courseId);
    
    /**
     * 根据课程ID获取用户未完成的练习
     */
    List<String> getUnfinishedExerciseIdsByCourse(String userId, String courseId);
    
    /**
     * 标记练习为已完成
     */
    void markExerciseAsComplete(String userId, String exerciseId, Integer score);
    
    /**
     * 检查用户是否完成了指定练习
     */
    boolean isExerciseCompleted(String userId, String exerciseId);
    
    /**
     * 获取用户练习完成状态
     */
    boolean getStudentExerciseStatus(String userId, String exerciseId);
    
    /**
     * 更新学生练习状态
     */
    void updateStudentExerciseStatus(String userId, String exerciseId, boolean isFinished, Integer score);
}